/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package model.dao;

import com.mysql.jdbc.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import model.bean.BeanArchivo;
import model.bean.BeanCategoria;
import model.bean.BeanCurso;
import model.bean.BeanSemestre;
import model.bean.BeanUsuario;
import model.bean.BeanValoracion;
import model.daobase.DBase;

/**
 *
 * @author Jesus
 */
public class DaoArchivo extends DBase {

    public ArrayList<BeanArchivo> lista() {

        this.init_mysql();
        PreparedStatement pstmt = null;
        ResultSet res = null;
        ArrayList<BeanArchivo> listaArchivos = new ArrayList<BeanArchivo>();

        try {
//                                                                                                                                                             a.valoracion 
             String query = "SELECT a.idarchivo,a.nombre, c.idcurso, c.nombre, u.idusuario, u.nombre,u.apellidos, ca.idcategoria, ca.nombre, a.fecha_subida, a.num_descargas, a.estado, s.idsemestre, s.nombre, a.nombre_md5"+
                " FROM archivo a  INNER JOIN curso c ON a.idcurso=c.idcurso INNER JOIN usuario u ON u.idusuario=a.idusuario"+
                 " INNER JOIN categoria ca ON ca.idcategoria=a.idcategoria INNER JOIN semestre s ON s.idsemestre=a.idsemestre WHERE a.estado=1";

            pstmt = (PreparedStatement) conn.prepareStatement(query);
            res = pstmt.executeQuery();
            BeanArchivo archivo;
            while (res.next()) {
                archivo = new BeanArchivo();

                archivo.setIdarchivo(res.getInt(1));
                archivo.setNombre(res.getString(2));   
                
                archivo.setCurso(new BeanCurso());                  
                archivo.getCurso().setIdcurso(res.getInt(3));
                archivo.getCurso().setNombre(res.getString(4));
                
                
                archivo.setUsuario(new BeanUsuario());                  
                archivo.getUsuario().setIdusuario(res.getInt(5));
                archivo.getUsuario().setNombre(res.getString(6));
                archivo.getUsuario().setApellidos(res.getString(7));
                
                archivo.setCategoria(new BeanCategoria());                  
                archivo.getCategoria().setIdcategoria(res.getInt(8));
                archivo.getCategoria().setNombre(res.getString(9));

                archivo.setFecha_subida(res.getString(10));
//                archivo.setValoracion(res.getFloat(11));
                archivo.setNum_descargas(res.getInt(11));
                archivo.setEstado(res.getString(12));
                
                archivo.setSemestre(new BeanSemestre()); 
                archivo.getSemestre().setIdsemestre(res.getInt(13));
                archivo.getSemestre().setNombre(res.getString(14));
                archivo.setNombre_md5(res.getString(15));
                
                listaArchivos.add(archivo);
            }

            res.close();
            pstmt.close();
            conn.close();

        } catch (SQLException e1) {
            e1.getMessage();
        }

        return listaArchivos;

    }
    
    
    public ArrayList<BeanArchivo> buscar(String nombre) {
         
        this.init_mysql();
        PreparedStatement pstmt = null;
        ResultSet res = null;
        
        ArrayList<BeanArchivo> listaArchivos = new ArrayList<BeanArchivo>();
        
        String name = nombre==""?"=nombre":" LIKE '"+nombre+"'";               
    
            System.out.println(name);
        
        try {

            String query = "SELECT a.idarchivo,a.nombre, c.idcurso, c.nombre, u.idusuario, u.nombre,u.apellidos, ca.idcategoria, ca.nombre, a.fecha_subida, a.num_descargas, a.estado, s.idsemestre, s.nombre, a.nombre_md5"+
                " FROM archivo a  INNER JOIN curso c ON a.idcurso=c.idcurso INNER JOIN usuario u ON u.idusuario=a.idusuario"+
                 " INNER JOIN categoria ca ON ca.idcategoria=a.idcategoria INNER JOIN semestre s ON s.idsemestre=a.idsemestre WHERE nombre " + name + "";
            
            pstmt = (PreparedStatement) conn.prepareStatement(query);
            

             
            
            System.out.println(query);
            res = pstmt.executeQuery();
            BeanArchivo archivo;
            
           while (res.next()) {
                archivo = new BeanArchivo();

                archivo.setIdarchivo(res.getInt(1));
                archivo.setNombre(res.getString(2));   
                
                archivo.setCurso(new BeanCurso());                  
                archivo.getCurso().setIdcurso(res.getInt(3));
                archivo.getCurso().setNombre(res.getString(4));
                
                
                archivo.setUsuario(new BeanUsuario());                  
                archivo.getUsuario().setIdusuario(res.getInt(5));
                archivo.getUsuario().setNombre(res.getString(6));
                archivo.getUsuario().setApellidos(res.getString(7));
                
                archivo.setCategoria(new BeanCategoria());                  
                archivo.getCategoria().setIdcategoria(res.getInt(8));
                archivo.getCategoria().setNombre(res.getString(9));

                archivo.setFecha_subida(res.getString(10));
//                archivo.setValoracion(res.getFloat(11));
                archivo.setNum_descargas(res.getInt(11));
                archivo.setEstado(res.getString(12));
                
                archivo.setSemestre(new BeanSemestre()); 
                archivo.getSemestre().setIdsemestre(res.getInt(13));
                archivo.getSemestre().setNombre(res.getString(14));
                archivo.setNombre_md5(res.getString(15));
                
                listaArchivos.add(archivo);
            }

            res.close();
            pstmt.close();
            conn.close();

        } catch (SQLException e1) {
            e1.getMessage();
        }

        return listaArchivos;

    }
    
    public ArrayList<BeanArchivo> lista0() {

        this.init_mysql();
        PreparedStatement pstmt = null;
        ResultSet res = null;
        ArrayList<BeanArchivo> listaArchivos = new ArrayList<BeanArchivo>();

        try {
//                                                                                                                                                             a.valoracion 
                                                                                                                                                              
             String query = "SELECT a.idarchivo,a.nombre, c.idcurso, c.nombre, u.idusuario, u.nombre,u.apellidos, ca.idcategoria, ca.nombre, a.fecha_subida, a.num_descargas, a.estado, s.idsemestre, s.nombre, a.nombre_md5"+
                " FROM archivo a  INNER JOIN curso c ON a.idcurso=c.idcurso INNER JOIN usuario u ON u.idusuario=a.idusuario"+
                 " INNER JOIN categoria ca ON ca.idcategoria=a.idcategoria INNER JOIN semestre s ON s.idsemestre=a.idsemestre WHERE a.estado=0";


            pstmt = (PreparedStatement) conn.prepareStatement(query);
            res = pstmt.executeQuery();
            BeanArchivo archivo;
            while (res.next()) {
                archivo = new BeanArchivo();

                archivo.setIdarchivo(res.getInt(1));
                archivo.setNombre(res.getString(2));   
                
                archivo.setCurso(new BeanCurso());                  
                archivo.getCurso().setIdcurso(res.getInt(3));
                archivo.getCurso().setNombre(res.getString(4));
                
                
                archivo.setUsuario(new BeanUsuario());                  
                archivo.getUsuario().setIdusuario(res.getInt(5));
                archivo.getUsuario().setNombre(res.getString(6));
                archivo.getUsuario().setApellidos(res.getString(7));
                
                archivo.setCategoria(new BeanCategoria());                  
                archivo.getCategoria().setIdcategoria(res.getInt(8));
                archivo.getCategoria().setNombre(res.getString(9));

                archivo.setFecha_subida(res.getString(10));
//                archivo.setValoracion(res.getFloat(11));
                archivo.setNum_descargas(res.getInt(11));
                archivo.setEstado(res.getString(12));
                 
                archivo.setSemestre(new BeanSemestre()); 
                archivo.getSemestre().setIdsemestre(res.getInt(13));
                archivo.getSemestre().setNombre(res.getString(14));
                archivo.setNombre_md5(res.getString(15));
                
                listaArchivos.add(archivo);
            }

            res.close();
            pstmt.close();
            conn.close();

        } catch (SQLException e1) {
            e1.getMessage();
        }

        return listaArchivos;

    }

 public void Update(int id) {

        this.init_mysql();
        PreparedStatement pstmt = null;
        ResultSet res = null;

        try {

            String query = "UPDATE archivo SET estado=1 WHERE idarchivo=" + id;
            pstmt = (PreparedStatement) conn.prepareStatement(query);
            pstmt.executeUpdate();
            pstmt.close();
            conn.close();

        } catch (SQLException e1) {
            e1.getMessage();
        }

    }
 
 
 
 public void Update0(int id) {

        this.init_mysql();
        PreparedStatement pstmt = null;
        ResultSet res = null;

        try {

            String query = "UPDATE archivo SET estado=0 WHERE idarchivo=" + id;
            pstmt = (PreparedStatement) conn.prepareStatement(query);
            pstmt.executeUpdate();
            pstmt.close();
            conn.close();

        } catch (SQLException e1) {
            e1.getMessage();
        }

    }
 
 public void delete(int id) {

        this.init_mysql();
        PreparedStatement pstmt = null;
        ResultSet res = null;

        try {

            String query = "DELETE FROM archivo WHERE idarchivo=" + id;
            pstmt = (PreparedStatement) conn.prepareStatement(query);
            pstmt.executeUpdate();
            pstmt.close();
            conn.close();

        } catch (SQLException e1) {
            e1.getMessage();
        }

    }
    
 
 
 
 
    public void subir_archivo(BeanArchivo archivo) {

        this.init_mysql();
        PreparedStatement pstmt = null;       

        try {
            String query = "INSERT into archivo(nombre,idcurso,"
                    + "idusuario,idcategoria,fecha_subida,num_descargas,estado,idsemestre,nombre_md5) values("
                    + "'" + archivo.getNombre() + "',"//                    
                    +  archivo.getCurso().getIdcurso() + ","
                    +  archivo.getUsuario().getIdusuario() + ","
                    +  archivo.getCategoria().getIdcategoria() + ","
                    + "'" + archivo.getFecha_subida() + "',"
                    + "0," 
                    + "'0'" + ","
                    + archivo.getSemestre().getIdsemestre()+ ","
                    + "'"+archivo.getNombre_md5() + "');";


            pstmt = (PreparedStatement) conn.prepareStatement(query);
            pstmt.executeUpdate();
            pstmt.close();
            conn.close();

        } catch (SQLException e1) {
            e1.getMessage();
        }

        

    }
   
    public BeanArchivo get(int id) {

        this.init_mysql();
        PreparedStatement pstmt = null;
        ResultSet res = null;
        
        BeanArchivo beanarchivo = new BeanArchivo();

        try {

            String query = "SELECT a.idarchivo,a.nombre, c.idcurso, c.nombre, u.idusuario, u.nombre,u.apellidos, ca.idcategoria, ca.nombre, a.fecha_subida, a.num_descargas, a.estado, s.idsemestre, s.nombre, a.nombre_md5"+
                " FROM archivo a  INNER JOIN curso c ON a.idcurso=c.idcurso INNER JOIN usuario u ON u.idusuario=a.idusuario"+
                 " INNER JOIN categoria ca ON ca.idcategoria=a.idcategoria INNER JOIN semestre s ON s.idsemestre=a.idsemestre WHERE a.idarchivo ="+id;
            pstmt = (PreparedStatement) conn.prepareStatement(query);
            res = pstmt.executeQuery();
            while (res.next()) {

                beanarchivo.setIdarchivo(res.getInt(1));
                beanarchivo.setNombre(res.getString(2));

                beanarchivo.setCurso(new BeanCurso());
                beanarchivo.getCurso().setIdcurso(res.getInt(3));
                beanarchivo.getCurso().setNombre(res.getString(4));


                beanarchivo.setUsuario(new BeanUsuario());
                beanarchivo.getUsuario().setIdusuario(res.getInt(5));
                beanarchivo.getUsuario().setNombre(res.getString(6));
                beanarchivo.getUsuario().setApellidos(res.getString(7));

                beanarchivo.setCategoria(new BeanCategoria());
                beanarchivo.getCategoria().setIdcategoria(res.getInt(8));
                beanarchivo.getCategoria().setNombre(res.getString(9));

                beanarchivo.setFecha_subida(res.getString(10));
//                archivo.setValoracion(res.getFloat(11));
                beanarchivo.setNum_descargas(res.getInt(11));
                beanarchivo.setEstado(res.getString(12));

                beanarchivo.setSemestre(new BeanSemestre());
                beanarchivo.getSemestre().setIdsemestre(res.getInt(13));
                beanarchivo.getSemestre().setNombre(res.getString(14));
                beanarchivo.setNombre_md5(res.getString(15));

               }

            res.close();
            pstmt.close();
            conn.close();

        } catch (SQLException e1) {
            e1.getMessage();
        }

        return beanarchivo;

    }

      public String descarga(int idarchivo) {
        this.init_mysql();
        PreparedStatement pstmt = null;
        ResultSet res = null;
        String ruta = null;
        try {
            String query =  "SELECT nombre_md5 "
                + "FROM archivo "
                + "WHERE (idarchivo LIKE '" + idarchivo + "') ";

            pstmt = (PreparedStatement) conn.prepareStatement(query);
            res = pstmt.executeQuery();
            while (res.next()) {
                ruta = res.getString(1);     
            }
            res.close();
            pstmt.close();
            conn.close();

        } catch (SQLException e1) {
            e1.getMessage();
        }
        return ruta;
    }
      
      
      public void actualizar_numero_descargas(int idarchivo,int numero) {
        this.init_mysql();
        PreparedStatement pstmt;
        
        try {
            String query =  "UPDATE  archivo"+ " SET num_descargas=" + numero + " WHERE idarchivo=" + idarchivo;
            pstmt = (PreparedStatement)conn.prepareStatement(query);
            pstmt.executeUpdate();
            pstmt.close();
            conn.close();
        } catch (SQLException e1) {
            e1.getMessage();
        }
    }
    
    public ArrayList<BeanArchivo> listarchivosxcursos(int id, int idcategoria, int search) {

        this.init_mysql();
        PreparedStatement pstmt = null;
        ResultSet res = null;
        ArrayList<BeanArchivo> listaArchivos = new ArrayList<BeanArchivo>();

        try {
//                                                                                                                                                             a.valoracion 
            String query = "SELECT a.idarchivo,a.nombre, c.idcurso, c.nombre, u.idusuario, u.nombre,u.apellidos, ca.idcategoria, ca.nombre, a.fecha_subida, a.num_descargas, a.estado, s.idsemestre, s.nombre, a.nombre_md5"+
                " FROM archivo a  INNER JOIN curso c ON a.idcurso=c.idcurso INNER JOIN usuario u ON u.idusuario=a.idusuario"+
                 " INNER JOIN categoria ca ON ca.idcategoria=a.idcategoria INNER JOIN semestre s ON s.idsemestre=a.idsemestre WHERE a.idcurso ="+id+" AND a.estado != 0";
            
            if(search == 1){
                query += " AND ca.idcategoria = "+idcategoria;
            }
            
            pstmt = (PreparedStatement) conn.prepareStatement(query);
            res = pstmt.executeQuery();
            BeanArchivo archivo;
            while (res.next()) {
                archivo = new BeanArchivo();

                archivo.setIdarchivo(res.getInt(1));
                archivo.setNombre(res.getString(2));   
                
                archivo.setCurso(new BeanCurso());                  
                archivo.getCurso().setIdcurso(res.getInt(3));
                archivo.getCurso().setNombre(res.getString(4));
                
                
                archivo.setUsuario(new BeanUsuario());                  
                archivo.getUsuario().setIdusuario(res.getInt(5));
                archivo.getUsuario().setNombre(res.getString(6));
                archivo.getUsuario().setApellidos(res.getString(7));
                
                archivo.setCategoria(new BeanCategoria());                  
                archivo.getCategoria().setIdcategoria(res.getInt(8));
                archivo.getCategoria().setNombre(res.getString(9));

                archivo.setFecha_subida(res.getString(10));
//                archivo.setValoracion(res.getFloat(11));
                archivo.setNum_descargas(res.getInt(11));
                archivo.setEstado(res.getString(12));
                
                archivo.setSemestre(new BeanSemestre()); 
                archivo.getSemestre().setIdsemestre(res.getInt(13));
                archivo.getSemestre().setNombre(res.getString(14));
                archivo.setNombre_md5(res.getString(15));
                
                listaArchivos.add(archivo);
            }

            res.close();
            pstmt.close();
            conn.close();

        } catch (SQLException e1) {
            e1.getMessage();
        }

        return listaArchivos;

    }
    
   
     
     
   public Double getMasDescargado(int id) {

        this.init_mysql();
        java.sql.PreparedStatement pstmt = null;
        ResultSet res = null;
        double prom=0;
       

        try {

            String query = "SELECT MAX(num_descargas) from archivo WHERE idarchivo="+id;
            
            pstmt = (java.sql.PreparedStatement) conn.prepareStatement(query);
            res = pstmt.executeQuery();
           while (res.next()) {
               
            prom=res.getDouble(1);
     
           }
        
           res.close();
            pstmt.close();
            conn.close();

        } catch (SQLException e1) {
            e1.getMessage();
        }

        return prom;

    } 
    
    
   public ArrayList<BeanArchivo> listMasDescargados() {

        this.init_mysql();
        java.sql.PreparedStatement pstmt = null;
        ResultSet res = null;
        ArrayList<BeanArchivo> list = new ArrayList<BeanArchivo>();
        int i = 0;
       

        try {

            String query = "SELECT idarchivo,nombre,num_descargas FROM archivo GROUP BY num_descargas DESC";
            
            pstmt = (java.sql.PreparedStatement) conn.prepareStatement(query);
            res = pstmt.executeQuery();
           while (res.next()) {
               
            BeanArchivo archivo = new BeanArchivo();
            DaoArchivo daoArchivo = new DaoArchivo();
            
            archivo.setIdarchivo(res.getInt(1));
            archivo.setNombre(res.getString(2));
            archivo.setNum_descargas(res.getInt(3));
            
            list.add(archivo);
            i++;
            if(i >=3){
                break;
            }
     
           }
        
           res.close();
            pstmt.close();
            conn.close();

        } catch (SQLException e1) {
            e1.getMessage();
        }

        return list;

    }
   
   
    public ArrayList<BeanArchivo> listMasRecientes() {

        this.init_mysql();
        java.sql.PreparedStatement pstmt = null;
        ResultSet res = null;
        ArrayList<BeanArchivo> list = new ArrayList<BeanArchivo>();
        int i = 0;
       

        try {

            String query = "SELECT idarchivo,nombre,fecha_subida FROM archivo GROUP BY fecha_subida DESC";
            
            pstmt = (java.sql.PreparedStatement) conn.prepareStatement(query);
            res = pstmt.executeQuery();
           while (res.next()) {
               
            BeanArchivo archivo = new BeanArchivo();
            DaoArchivo daoArchivo = new DaoArchivo();
            
            archivo.setIdarchivo(res.getInt(1));
            archivo.setNombre(res.getString(2));
            archivo.setFecha_subida(res.getString(3));
            
            list.add(archivo);
            i++;
            if(i >=3){
                break;
            }
     
           }
        
           res.close();
            pstmt.close();
            conn.close();

        } catch (SQLException e1) {
            e1.getMessage();
        }

        return list;

    }
   
   
    
}
